package com.tianji.learning.service;

import com.tianji.learning.domain.po.PointsRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tianji.learning.domain.vo.PointsStatisticsVO;
import com.tianji.learning.enums.PointsRecordType;

import java.util.List;

/**
 * <p>
 * 学习积分记录，每个月底清零 服务类
 * </p>
 *
 * @author zr
 * @since 2024-07-19
 */
public interface IPointsRecordService extends IService<PointsRecord> {

    /**
     * 为用户添加积分记录。
     * 此方法用于记录用户积分的变化情况，通过创建并保存一个积分记录对象来实现。
     * 积分的增加或减少由传入的积分值决定，而积分记录的类型则由sign参数确定。
     *
     * @param userId 用户的ID，用于标识积分变化的用户。
     * @param points 积分值。
     * @param sign 积分记录的类型，用于区分不同的积分操作场景。
     */
    void addPointsRecord(Long userId, Integer points, PointsRecordType sign);

    /**
     * 查询今天的积分统计信息。
     * <p>
     * 本方法用于获取当前用户今天的所有积分统计信息。返回一个包含积分统计详情的列表，
     * 每个统计详情都包含了积分的获取和情况，以及其他相关的统计信息。
     *
     * @return List<PointsStatisticsVO> 返回一个积分统计信息的列表。
     */
    List<PointsStatisticsVO> queryMyPointsToday();

    /**
     * 根据赛季创建点记录表
     *
     * 本方法用于在数据库中根据指定的赛季创建一个新的积分记录表。这需要在数据库管理
     * 系统中执行相应的SQL语句来完成表的创建。表的命名和结构将根据赛季参数进行
     * 生成，以便于区分不同赛季的点记录。
     *
     * @param season 赛季编号
     *              使用整数类型表示赛季，该参数将被用于构造点记录表的名称，以区分
     *              不同赛季的表。赛季编号应为非负整数，且在数据库中应为唯一值。
     */
    void createPointsRecordTableBySeason(Integer season);
}
